<?php

namespace Admin\Controller;

use Think\Controller;

/**
 * 列表管理
 */
class ThinkmodelController extends CommonController {

    public function models($model = null, $p = 0) {
        $model || $this->error('模型名标识必须！');
        $page = intval($p);
        $page = $page ? $page : 1; //默认显示第一页数据
        //获取模型信息
        $model = M('Models')->getByName($model);
        $model || $this->error('模型不存在！');

        //解析列表规则
        $fields = array();
        $grids = preg_split('/[;\r\n]+/s', trim($model['list_grid']));
        foreach ($grids as &$value) {

            if (trim($value) === '') {
                continue;
            }
            // 字段:标题:链接
            $val = explode(':', $value);
            // 支持多个字段显示
            $field = explode(',', $val[0]);
            $value = array('field' => $field, 'title' => $val[1]);
            if (isset($val[2])) {
                // 链接信息
                $value['href'] = $val[2];
                // 搜索链接信息中的字段信息
                preg_replace_callback('/\[([a-z_]+)\]/', function($match) use(&$fields) {
                    $fields[] = $match[1];
                }, $value['href']);
            }
            if (strpos($val[1], '|')) {
                // 显示格式定义
                list($value['title'], $value['format']) = explode('|', $val[1]);
            }
            foreach ($field as $val) {
                $array = explode('|', $val);
                $fields[] = $array[0];
            }
        }

        // 过滤重复字段信息
        $fields = array_unique($fields);
        // 关键字搜索
        $map = array();
        $key = $model['search_key'] ? $model['search_key'] : 'title';
        if (isset($_REQUEST[$key])) {
            $map[$key] = array('like', '%' . $_GET[$key] . '%');
            unset($_REQUEST[$key]);
        }
        // 条件搜索
        foreach ($_REQUEST as $name => $val) {
            if (in_array($name, $fields)) {
                $map[$name] = $val;
            }
        }
        $row = empty($model['list_row']) ? 10 : $model['list_row'];

        //读取模型数据列表
        if ($model['extend']) {

            $name = get_table_name($model['id']);
            $parent = get_table_name($model['extend']);
            $fix = C("DB_PREFIX");

            $key = array_search('id', $fields);
            if (false === $key) {
                array_push($fields, "{$fix}{$parent}.id as id");
            } else {
                $fields[$key] = "{$fix}{$parent}.id as id";
            }

            /* 查询记录数 */
            $count = M($parent)->join("INNER JOIN {$fix}{$name} ON {$fix}{$parent}.id = {$fix}{$name}.id")->where($map)->count();

            // 查询数据
            $data = M($parent)
                    ->join("INNER JOIN {$fix}{$name} ON {$fix}{$parent}.id = {$fix}{$name}.id")
                    /* 查询指定字段，不指定则查询所有字段 */
                    ->field(empty($fields) ? true : $fields)
                    // 查询条件
                    ->where($map)
                    /* 默认通过id逆序排列 */
                    ->order("{$fix}{$parent}.id DESC")
                    /* 数据分页 */
                    ->page($page, $row)
                    /* 执行查询 */
                    ->select();
        } else {

            if ($model['need_pk']) {
                in_array('id', $fields) || array_push($fields, 'id');
            }

            $name = parse_name(get_table_name($model['id']), true);

            $data = M($name)
                    /* 查询指定字段，不指定则查询所有字段 */
                    ->field(empty($fields) ? true : $fields)
                    // 查询条件
                    ->where($map)
                    /* 默认通过id逆序排列 */
                    ->order($model['need_pk'] ? 'id DESC' : '')
                    /* 数据分页 */
                    ->page($page, $row)
                    /* 执行查询 */
                    ->select();

            /* 查询记录总数 */
            $count = M($name)->where($map)->count();
        }

        //分页
        if ($count > $row) {
            $page = new \Think\Page($count, $row);
            $page->setConfig('theme', '%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%');
            $this->assign('_page', $page->show());
        }

        $data = $this->parseDocumentList($data, $model['id']);
        $this->assign('model', $model);
        $this->assign('list_grids', $grids);

        $this->assign('_list', $data);
        $this->meta_title = $model['title'] . '列表';
        $this->display($model['template_list']);
    }

    /**
     * 模型添加
     */
    public function add($model = null) {

        //获取模型信息
        $model = M('Models')->where(array('status' => 1))->find($model);

        $model || $this->error('模型不存在！');
        if (IS_POST) {
            $Model = D(parse_name(get_table_name($model['id']), 1));
            // 获取模型的字段信息
            $Model = $this->checkAttr($Model, $model['id']);
            if ($Model->create() && $Model->add()) {
                $this->success('添加' . $model['title'] . '成功！', U('models?model=' . $model['name']));
            } else {
                $this->error($Model->getError());
            }
        } else {

            $fields = get_model_attribute($model['id']);
            $this->assign('model', $model);
            $this->assign('fields', $fields);
            $this->meta_title = '新增' . $model['title'];
            $this->display($model['template_add'] ? $model['template_add'] : '');
        }
    }

    /**
     * 模型编辑
     */
    public function edit($model = null, $id = 0, $templateFile = '') {
        $model = M('Models')->where(array('status' => 1))->find($model);
        $model || $this->error('模型不存在！');
        $data = M(get_table_name($model ['id']))->find($id);
        $data || $this->error('数据不存在！');
        if (IS_POST) {
            $Model = D(parse_name(get_table_name($model['id']), 1));
            // 获取模型的字段信息
            $Model = $this->checkAttr($Model, $model['id']);
            if ($Model->create() && $Model->where(array("id"=>$id))->save()) {
                $this->success('保存' . $model['title'] . '成功！', U('models?model=' . $model['name']));
            } else {
                $this->error($Model->getError());
            }
        }
        $fields = get_model_attribute($model['id']);
        $this->assign('data', $data);
        $this->assign('model', $model);
        $this->assign('fields', $fields);
        $this->meta_title = '新增' . $model['title'];
        $this->display($model['template_edit'] ? $model['template_edit'] : '');
    }

    /**
     * 验证
     */
    protected function checkAttr($Model, $model_id) {
        $fields = get_model_attribute($model_id, false);
        $validate = $auto = array();
        foreach ($fields as $key => $attr) {
            if ($attr['type'] == 'prize' && $_POST[$key]) {
                //判断奖品库选择器 数量是否大于库存
                $this->checkPriceNum($_POST[$key]);
            }
            if ($attr['is_must']) { // 必填字段
                $validate [] = array(
                    $attr ['name'],
                    'require',
                    $attr ['title'] . '必须!'
                );
            }

            // 自动验证规则
            if (!empty($attr ['validate_rule']) || $attr ['validate_type'] == 'unique') {
                $validate [] = array(
                    $attr ['name'],
                    $attr ['validate_rule'],
                    $attr ['error_info'] ? $attr ['error_info'] : $attr ['title'] . '验证错误',
                    0,
                    $attr ['validate_type'],
                    $attr ['validate_time']
                );
            }
            // 自动完成规则
            if (!empty($attr ['auto_rule'])) {
                $auto [] = array(
                    $attr ['name'],
                    $attr ['auto_rule'],
                    $attr ['auto_time'],
                    $attr ['auto_type']
                );
            } elseif ('checkbox' == $attr ['type'] || 'dynamic_checkbox' == $attr ['type']) { // 多选型
                $auto [] = array(
                    $attr ['name'],
                    'arr2str',
                    3,
                    'function'
                );
            } elseif ('datetime' == $attr ['type']) { // 日期型
                $auto [] = array(
                    $attr ['name'],
                    'strtotime',
                    3,
                    'function'
                );
            } elseif ('date' == $attr ['type']) { // 日期型
                $auto [] = array(
                    $attr ['name'],
                    'strtotime',
                    3,
                    'function'
                );
            }
        }
        return $Model->validate($validate)->auto($auto);
    }

}
